package com.gitee.liuzhi.demo.other;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

/**
 * @Author liuzhi
 * @Date 2023/9/6 20:50
 * @Version 1.0
 * @Description ScheduledExecutorService 延迟或定期执行任务
 */
public class ScheduledExecutorServiceDemo {


    private static final ScheduledExecutorService SCHEDULED_EXECUTOR_SERVICE;

    static {
        SCHEDULED_EXECUTOR_SERVICE = Executors.newScheduledThreadPool(5);
    }

    public static void main(String[] args) {
        // scheduleTest();
        // scheduleAtFixedRateTest();
        scheduleWithFixedDelay();
    }

    /**
     * schedule
     * 创建并执行在给定延迟后启用的单次操作
     * <p>
     * + long delay : 延迟时间
     * + TimeUnit unit : 时间单位
     */
    private static void scheduleTest() {
        System.out.println("10秒后执行延迟操作");
        ScheduledFuture<?> scheduledFuture = SCHEDULED_EXECUTOR_SERVICE.schedule(() -> System.out.println("延迟操作执行"), 10, TimeUnit.SECONDS);
    }

    /**
     * scheduleAtFixedRate
     * 创建并执行在给定的初始延迟之后, 以给定的时间间隔执行周期性动作
     * <p>
     * + long initialDelay : 初始延迟
     * + long period : 后续的周期间隔时间
     * + TimeUnit unit : 时间单位
     */
    private static void scheduleAtFixedRateTest() {
        System.out.println("10秒后执行延迟操作, 后每秒一次");
        ScheduledFuture<?> scheduledFuture = SCHEDULED_EXECUTOR_SERVICE.scheduleAtFixedRate(() -> System.out.println("延迟操作执行"), 10, 1, TimeUnit.SECONDS);
    }

    /**
     * scheduleWithFixedDelay
     * 创建并执行在给定的初始延迟之后首先启用的定期动作, 随后上一个执行的终止和下一个执行的开始之间给定的延迟
     */
    private static void scheduleWithFixedDelay() {
        ScheduledFuture<?> scheduledFuture = SCHEDULED_EXECUTOR_SERVICE.scheduleWithFixedDelay(() -> System.out.println("延迟操作执行"), 10, 5, TimeUnit.SECONDS);
    }

}
